home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / PluginSRC_EvenMore / guide2text3.e < prev    next >
Text File  |  2002-03-12  |  11KB  |  352 lines

  1. /*
  2.    Guide 2 Text
  3.    EvenMore FileIO plugin
  4.    Author: Chris Perver
  5.    Copyright (c) 2001
  6. */
  7.  
  8.  
  9. OPT REG=5
  10.  
  11. LIBRARY 'guide2text.plugin',1,1,'Guide2Text 1.16' IS em_main, em_end, em_info, em_pluginid, em_begin, em_format
  12.  
  13. MODULE 'tools/ctype', '*epo'
  14.  
  15. DEF mem2, len2, numchars =0
  16.  
  17.  
  18. PROC em_isdatatype(memadr)
  19.   DEF tstr[10]:STRING
  20.   IF memadr[0] = "@"
  21.     StrCopy(tstr, memadr + 1, 10)
  22.     LowerStr(tstr)
  23.     IF InStr(tstr,'database') = 0 THEN RETURN TRUE
  24.   ENDIF
  25. ENDPROC FALSE
  26.  
  27. PROC em_parsedata(epo:PTR TO em_pluginobj)->memadr, lenadr)
  28.   DEF memadr:PTR TO CHAR, lenadr:PTR TO CHAR
  29.  
  30.   DEF count = 0, count2 = 0, newcount = 0, newcount2 = 0, tempstr[10]:STRING
  31.   DEF foundag = FALSE, printwordnum = 0, ww = FALSE, wordwrap = 80
  32.   DEF oldpos:PTR TO CHAR, oldcount, oldcc
  33.  
  34.   memadr := epo.buffer
  35.   lenadr := epo.length
  36.  
  37.   -> Allocate memory for file
  38. ->  IF (mem2 := New(lenadr + 1)) = NIL THEN RETURN -1
  39. ->  mem2[lenadr + 1] := "\n"                                                      -> Put safety LF at the end of mem
  40.   mem2 := memadr
  41.  
  42.  
  43.   WHILE (count < lenadr)                      -> while we are not at the end of the file
  44.     IF memadr[count] = "@"                 -> if command then
  45.  
  46.       -> Check for keywords
  47.  
  48.       StrCopy(tempstr, memadr + count + 1, 10)         -> Find out what command is
  49.       LowerStr(tempstr)
  50.  
  51.         newcount  := 0
  52.         newcount2 := 0
  53.         printwordnum := -1
  54.         foundag := TRUE
  55.         IF tempstr[0] = "{"                            ->  Check all keywords
  56.           printwordnum := 0
  57.         ELSEIF InStr(tempstr,'database') = 0
  58.         ELSEIF InStr(tempstr,'node') = 0
  59.  
  60.         ELSEIF InStr(tempstr,'endnode') = 0
  61.         ELSEIF InStr(tempstr,'title') = 0
  62.         ELSEIF InStr(tempstr,'index') = 0
  63.         ELSEIF InStr(tempstr,'author') = 0
  64.         ELSEIF InStr(tempstr,'wordwrap') = 0
  65.           ww := TRUE
  66.         ELSEIF InStr(tempstr,'master') = 0
  67.         ELSEIF InStr(tempstr,'width') = 0
  68.         ELSEIF InStr(tempstr,'prev') = 0
  69.         ELSEIF InStr(tempstr,'next') = 0
  70.         ELSEIF InStr(tempstr,'toc') = 0
  71.         ELSEIF InStr(tempstr,'$ver') = 0
  72.         ELSEIF InStr(tempstr,'(c)') = 0
  73.         ELSEIF InStr(tempstr,'rem') = 0
  74.         ELSEIF InStr(tempstr,'font') = 0
  75.         ELSEIF InStr(tempstr,'smartwrap') = 0
  76.           ww := TRUE
  77.         ELSEIF InStr(tempstr,'language') = 0
  78.         ELSE
  79.           foundag := FALSE
  80.           newcount  := 1
  81.           newcount2 := 1
  82.           mem2[count2] := memadr[count]    -> copy the char
  83.         ENDIF
  84.  
  85.         IF foundag
  86.           oldpos := mem2 + count2
  87.           newcount, newcount2 := skipcomm(memadr + count, lenadr - count, oldpos, printwordnum)
  88.         ENDIF
  89.   ->      numchars := numchars + newcount2
  90.  
  91.         count  := count  + newcount
  92.         count2 := count2 + newcount2
  93.  
  94.  
  95.     ELSE
  96.       -> Skip backslash if doubled
  97.       IF memadr[count] = $5C
  98.         IF memadr[count + 1] = $5C THEN INC count
  99.       ENDIF
  100.  
  101.       mem2[count2++] := memadr[count++]    -> copy the char
  102.  
  103.  
  104.       -> WORDWRAP IF NECESSARY
  105.       -> WORDWRAP
  106.          IF ww
  107.          IF numchars >= wordwrap
  108.           -> Find last space
  109.           IF isspace(mem2[count2]) = TRUE
  110.             mem2[count2++] := "\n"
  111.             numchars := 0
  112.           ELSE
  113.             oldcount := count2
  114.             oldcc  := numchars
  115.             WHILE isspace(mem2[count2]) = FALSE
  116.               mem2[count2 + 1] := mem2[count2]
  117.               DEC count2
  118.               DEC numchars
  119.             ENDWHILE
  120.  
  121.             INC count2
  122.             mem2[count2] := "\n"
  123.             numchars := oldcc - numchars ->currchar
  124.  
  125.             count2 := oldcount + 1
  126.          ENDIF
  127.        ENDIF
  128.        ENDIF
  129.  
  130.  
  131.    /*   IF ww = TRUE
  132.         IF memadr[count] = "\n"
  133.           numchars := 0
  134.         ELSE
  135.  
  136.  
  137.  
  138.           IF numchars >= 80
  139.  
  140.             -> Find last space
  141.  
  142.             WHILE isspace(memadr[count]) = FALSE
  143.               DEC count
  144.               DEC count2
  145.             ENDWHILE
  146.  
  147.             IF memadr[count] = "["
  148.               IF memadr[count - 1] = "\e"
  149.                 count := count - 2
  150.               ENDIF
  151.             ENDIF
  152.  
  153.  
  154.             mem2[count2++] := "\n"
  155.  
  156.             IF memadr[count] = " " THEN INC count
  157.  
  158.             numchars := 0
  159.           ELSE
  160.             numchars := numchars +1
  161.           ENDIF
  162.         ENDIF
  163.       ENDIF
  164.  
  165.             */
  166.  
  167.     ENDIF
  168.   ENDWHILE
  169.   mem2[count2] := "\n"
  170.  
  171.  -> IF memadr
  172.  ->   Dispose(memadr); memadr := NIL
  173.  -> ENDIF
  174. ENDPROC mem2, count2
  175. -><
  176. ->> skipcomm(fmem:PTR TO CHAR,len, newmem, printword = 0)
  177. PROC skipcomm(fmem:PTR TO CHAR,len, newmem, printword = 0)
  178.   DEF count = 0, count2 = 0, iscomm = FALSE, notdone = TRUE, quotes = FALSE, wordsdone = 0, spaces = FALSE
  179.   DEF tempstr[10]:STRING
  180.  
  181.   WHILE notdone
  182.  
  183.     IF fmem[count]=" "                    -> If space
  184.       IF spaces                           ->  If we are skipping them
  185.         INC count                         ->   Skip space
  186.       ELSE                                ->  If this is a new space
  187.         IF quotes                         ->   If we are not in a quote
  188.           IF wordsdone = printword
  189.             newmem[count2] := fmem[count] ->    Copy space
  190.             INC count2
  191.             INC numchars
  192.           ENDIF
  193.           INC count
  194.         ELSE
  195.           spaces := TRUE                  ->    We are now skipping spaces
  196.           INC wordsdone                   ->    We have counted a new word
  197.           INC count                       ->    Skip space
  198.         ENDIF
  199.       ENDIF
  200.     ELSEIF fmem[count]=$22                ->  If "
  201.       newmem[count2++] := "\e"            ->
  202.       newmem[count2++] := "["
  203.       IF quotes                           ->  If we are in a quote
  204.         quotes := FALSE                   ->   End this quote
  205.         INC count                         ->   Skip "
  206.         newmem[count2++] := "0"
  207.       ELSE                                ->  If we aren't in a quote
  208.         quotes := TRUE                    ->   We are in a quote
  209.         INC count                         ->   Skip
  210.         newmem[count2++] := "2"
  211.       ENDIF
  212.       newmem[count2++] := "m"
  213.     ELSEIF fmem[count]="{"                -> If {
  214.       IF quotes                           ->  If we are in a quote
  215.         IF wordsdone = printword          ->   If we are at the word to copy
  216.           newmem[count2] := fmem[count]   ->   Copy {
  217.           INC count2
  218.         ENDIF
  219.         INC count                         ->   Skip {
  220.       ELSE                                ->  If we aren't in a quote
  221.         iscomm := TRUE
  222.  
  223.         SELECT 256 OF fmem[count + 1]
  224.           CASE "u","U"                        -> If found U command
  225.             newmem[count2++] := "\e"
  226.             newmem[count2++] := "["
  227.             IF fmem[count+2] = "}"        -> Its underscore
  228.               newmem[count2++] := "4"
  229.             ELSE
  230.               newmem[count2++] := "2"
  231.               SELECT 256 OF fmem[count+2]       ->  Its undoing one of these styles
  232.                 CASE "u","U"; newmem[count2++] := "4"
  233.                 CASE "b","B"; newmem[count2++] := "1"
  234.                 CASE "i","I"; newmem[count2++] := "3"
  235.               ENDSELECT
  236.             ENDIF
  237.             newmem[count2++] := "m"
  238.           CASE "i","I"
  239.             IF fmem[count+2] = "}"
  240.               newmem[count2++] := "\e"
  241.               newmem[count2++] := "["
  242.               newmem[count2++] := "3"
  243.               newmem[count2++] := "m"
  244.             ENDIF
  245.           CASE "f","F"                            -> FG pen
  246.             IF fmem[count+2] = ("g" OR "G")
  247.               count := count + 4                -> Skip char
  248.               StrCopy(tempstr, fmem + count, 10)
  249.               LowerStr(tempstr)
  250.               newmem[count2++] := "\e"
  251.               newmem[count2++] := "["
  252.               newmem[count2++] := "3"
  253.               IF     InStr(tempstr, 'filltext') = 0;   newmem[count2++] := "1"
  254.               ELSEIF InStr(tempstr, 'fill') = 0;       newmem[count2++] := "3"
  255.               ELSEIF InStr(tempstr, 'text') = 0;       newmem[count2++] := "1"
  256.               ELSEIF InStr(tempstr, 'highlight') = 0;  newmem[count2++] := "2"
  257.               ELSEIF InStr(tempstr, 'back') = 0;       newmem[count2++] := "0"
  258.               ELSEIF InStr(tempstr, 'shine') = 0;      newmem[count2++] := "2"
  259.               ENDIF
  260.               newmem[count2++] := "m"
  261.             ENDIF
  262.           CASE "b","B"
  263.             IF fmem[count+2] = "}"
  264.               newmem[count2++] := "\e"
  265.               newmem[count2++] := "["
  266.               newmem[count2++] := "1"
  267.               newmem[count2++] := "m"
  268.             ELSEIF fmem[count+2] = ("g" OR "G")       -> BG pen change
  269.               count := count + 4             -> Skip char
  270.               StrCopy(tempstr, fmem + count, 10)
  271.               LowerStr(tempstr)
  272.               newmem[count2++] := "\e"
  273.               newmem[count2++] := "["
  274.               newmem[count2++] := "4"
  275.               IF     InStr(tempstr, 'filltext') = 0;   newmem[count2++] := "1"
  276.               ELSEIF InStr(tempstr, 'fill') = 0;       newmem[count2++] := "3"
  277.               ELSEIF InStr(tempstr, 'text') = 0;       newmem[count2++] := "1"
  278.               ELSEIF InStr(tempstr, 'highlight') = 0;  newmem[count2++] := "2"
  279.               ELSEIF InStr(tempstr, 'back') = 0;       newmem[count2++] := "0"
  280.               ELSEIF InStr(tempstr, 'shine') = 0;      newmem[count2++] := "2"
  281.               ENDIF
  282.               newmem[count2++] := "m"
  283.             ENDIF
  284.           ENDSELECT
  285.         INC count                    ->   Skip {
  286.       ENDIF
  287.     ELSEIF fmem[count]="}"                -> If }
  288.       IF quotes                           ->  If we are in a quote
  289.         IF wordsdone = printword
  290.           newmem[count2] := fmem[count]   ->  Copy }
  291.           INC count2
  292.         ENDIF
  293.         INC count
  294.       ELSE                                ->  If we aren't in a quote
  295.         IF iscomm                         ->   If we are in a command
  296.           notdone := FALSE                ->    End of command
  297.           INC count                       ->    Skip }
  298.         ENDIF
  299.       ENDIF
  300.     ELSEIF fmem[count]="\n"               -> If EOL
  301.       notdone := FALSE                    ->  End
  302.       numchars := 0
  303.     ELSE                                  -> If any other text
  304.       IF quotes                           ->  If we are in a quote
  305.         IF wordsdone =printword
  306.           newmem[count2] := fmem[count]   ->   Copy text
  307.           INC count2
  308.           INC numchars
  309.         ENDIF
  310.         INC count
  311.       ELSE                                ->  If we aren't in a quote
  312.         IF spaces                         ->   If we are counting spaces
  313.           spaces := FALSE                 ->    Stop counting spaces
  314.           INC count                       ->    Skip text
  315.         ELSE                              ->   If not counting spaces
  316.           INC count                       ->    Skip text
  317.         ENDIF
  318.       ENDIF
  319.     ENDIF
  320.  
  321.   ENDWHILE
  322. ENDPROC count, count2
  323. -><
  324.  
  325. -> *** STANDARD PROCS FOR PLUGINS
  326.  
  327.  
  328. PROC em_main(epo:PTR TO em_pluginobj)
  329.     mem2, len2 := em_parsedata(epo) ->epo.buffer, epo.length)
  330.     epo.buffer := mem2
  331.     epo.length := len2
  332.     RETURN TRUE
  333. ENDPROC
  334.  
  335. PROC em_begin(epo:PTR TO em_pluginobj)
  336.   IF em_isdatatype(epo.buffer) = TRUE
  337.     RETURN TRUE
  338.   ELSE
  339.     RETURN FALSE
  340.   ENDIF
  341. ENDPROC
  342.  
  343. PROC em_end()      IS EMPTY
  344.  
  345. PROC em_info()     IS 'Guide2Text 1.16'
  346.  
  347. PROC em_pluginid() IS "FILE"
  348.  
  349. PROC em_format()   IS 'AmigaGuide'
  350.  
  351. PROC main()        IS EMPTY
  352.